package cn.me.alphamq.nameserver.store;

import cn.me.alphamq.nameserver.cache.Container;
import io.netty.channel.ChannelHandlerContext;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 同步复制的 ctx 的管理器
 *
 * @author f
 */
public class ReplicationChannelManager {

    /**
     * 存放 ctx 的 map
     */
    private final Map<String, ChannelHandlerContext> ctxMap = new ConcurrentHashMap<>();

    /**
     * 获取可用的从节点 ctx 的 map，同时移除不可用的 ctx
     *
     * @return
     */
    public Map<String, ChannelHandlerContext> getValidCtxMap() {
        // 不可用的 channel 的 ctxId 链表
        List<String> invalidChannelCtxIdList = new ArrayList<>();

        // 挑出不可用的 channel
        for (String ctxId : ctxMap.keySet()) {
            if (!ctxMap.get(ctxId).channel().isActive()) {
                invalidChannelCtxIdList.add(ctxId);
            }
        }

        // 清理不可用的 channel
        for (String invalidChannelCtxId : invalidChannelCtxIdList) {
            ctxMap.remove(invalidChannelCtxId);
        }

        // 返回可用的 ctx 的 map
        return ctxMap;
    }

    /**
     * 放入新的 ctx
     *
     * @param ctxId ctx 的唯一标识
     * @param ctx   ctx 对象
     */
    public void put(String ctxId, ChannelHandlerContext ctx) {
        ctxMap.put(ctxId, ctx);
    }

    /**
     * 获取 ctx
     *
     * @param ctxId ctx 的唯一标识
     * @return
     */
    public ChannelHandlerContext get(String ctxId) {
        return ctxMap.get(ctxId);
    }
}
